package com.example.choupaiapp.main.util;

import com.amap.api.location.AMapLocationClient;
import com.amap.api.location.AMapLocationClientOption;
import com.amap.api.location.AMapLocationListener;
import com.amap.api.maps.AMapUtils;
import com.amap.api.maps.model.LatLng;
import com.amap.api.services.core.LatLonPoint;
import com.amap.api.services.help.Inputtips;
import com.amap.api.services.help.InputtipsQuery;
import com.amap.api.services.poisearch.PoiSearch;
import com.example.choupaiapp.common.util.ContextUtil;
import com.example.choupaiapp.main.fragment.HomeFragment;
import com.orhanobut.logger.Logger;

/**
 * Created by ASUS on 2019/11/4.
 */

public class LocationUtil {

    //声明AMapLocationClient类对象
    private AMapLocationClient mLocationClient = null;
    //声明AMapLocationClientOption对象
    private AMapLocationClientOption mLocationOption = null;

    private static LocationUtil locationUtil = null;
    private PoiSearch.Query query;
    private PoiSearch poiSearch;
    private Inputtips inputTips;


    private LocationUtil() {
    }

    public static LocationUtil getInstance() {
        if (locationUtil == null) {
            locationUtil = new LocationUtil();
        }
        return locationUtil;
    }

    public void setLocationListener(AMapLocationListener listener) {
        //设置定位回调监听
        mLocationClient.setLocationListener(listener);
    }

    public void locationOption() {
        //初始化定位
        mLocationClient = new AMapLocationClient(ContextUtil.getContext());

        //初始化AMapLocationClientOption对象
        mLocationOption = new AMapLocationClientOption();

        /**
         * 设置定位场景，目前支持三种场景（签到、出行、运动，默认无场景）
         */
//        mLocationOption.setLocationPurpose(AMapLocationClientOption.AMapLocationPurpose.SignIn);

        //设置定位模式为AMapLocationMode.Hight_Accuracy，高精度模式。
        mLocationOption.setLocationMode(AMapLocationClientOption.AMapLocationMode.Hight_Accuracy);

        //优先gps
//        mLocationOption.setGpsFirst(true);

        //获取一次定位结果：
        //该方法默认为false。
        mLocationOption.setOnceLocation(true);

        //获取最近3s内精度最高的一次定位结果：
        //设置setOnceLocationLatest(boolean b)接口为true，启动定位时SDK会返回最近3s内精度最高的一次定位结果。如果设置其为true，setOnceLocation(boolean b)接口也会被设置为true，反之不会，默认为false。
        mLocationOption.setOnceLocationLatest(true);

        //设置定位间隔,单位毫秒,默认为2000ms，最低1000ms。默认连续定位
//        mLocationOption.setInterval(1000);

        //设置是否返回地址信息（默认返回地址信息）
        mLocationOption.setNeedAddress(true);

        //设置是否允许模拟位置,默认为true，允许模拟位置
        mLocationOption.setMockEnable(true);

        //单位是毫秒，默认30000毫秒，建议超时时间不要低于8000毫秒。
        mLocationOption.setHttpTimeOut(20000);

        //缓存机制
        mLocationOption.setLocationCacheEnable(true);

    }

    public void LocationDestroy() {
        if (mLocationClient != null) {
            mLocationClient.onDestroy();
        }
    }

    public AMapLocationClient getmLocationClient() {
        return mLocationClient;
    }

    public void startLocation() {
        if (null != mLocationOption) {
            mLocationClient.setLocationOption(mLocationOption);
            //设置场景模式后最好调用一次stop，再调用start以保证场景模式生效
            mLocationClient.stopLocation();
            mLocationClient.startLocation();
        }
    }

    public boolean isStarted() {
        if (mLocationClient != null) {
            return mLocationClient.isStarted();
        }
        return false;
    }

    public void stopLocation() {
        Logger.e("stop");
//        mLocationClient.stopLocation();//停止定位后，本地定位服务并不会被销毁
    }

    public void searchPoiOption(String keyWord, String cityCode, PoiSearch.OnPoiSearchListener listener, int i, double lat, double lon) {
        query = new PoiSearch.Query(keyWord, "", cityCode);
        query.setCityLimit(false);
        //keyWord表示搜索字符串，
        //第二个参数表示POI搜索类型，二者选填其一，选用POI搜索类型时建议填写类型代码，码表可以参考下方（而非文字）
        //cityCode表示POI搜索区域，可以是城市编码也可以是城市名称，也可以传空字符串，空字符串代表全国在全国范围内进行搜索

        poiSearch = new PoiSearch(ContextUtil.getContext(), query);
        poiSearch.setOnPoiSearchListener(listener);

        //设置查询范围：经纬度、半径、是否从近到远排序（默认是）
        if (lat != 0 && lon != 0) {
            LatLonPoint latLonPoint = new LatLonPoint(lat, lon);
            poiSearch.setBound(new PoiSearch.SearchBound(latLonPoint, i, true));
        }
    }

    public void setQuery(int pageNum, int pageSize) {
        query.setPageSize(pageSize);// 设置每页最多返回多少条poiitem
        query.setPageNum(pageNum);//设置查询页码
        poiSearch.setQuery(query);
    }

    public void searchPoi() {
        poiSearch.searchPOIAsyn();
    }


    public void searchInputOption(String keyWord, Inputtips.InputtipsListener listener) {
        InputtipsQuery inputquery = new InputtipsQuery(keyWord, null);
        inputTips = new Inputtips(ContextUtil.getContext(), inputquery);
        inputTips.setInputtipsListener(listener);
    }

    public void searchInput() {
        inputTips.requestInputtipsAsyn();
    }

    public float calculateDistance(double lat, double lon) {
        LatLng latLng = new LatLng(HomeFragment.lat, HomeFragment.lon);
        LatLng latLng1 = new LatLng(lat, lon);
        return AMapUtils.calculateLineDistance(latLng, latLng1);
    }

    public PoiSearch.Query getQuery() {
        return query;
    }
}
